#include "head.h"
#include "sem.h"

void sem_set(int semid, int semnum, int val)
{
    union semun a;
    a.val = val;
    semctl(semid, semnum, SETVAL, a);
}

bool __sem_pv(int semid, int semnum, int op)
{
    struct sembuf ops[1];
    ops[0].sem_num = semnum;
    ops[0].sem_op  = op;

    if(semop(semid, ops, 1) == -1)
        return false;

    // 对信号量semid中的两个元素
    // 进行原子性的P/V操作
    // struct sembuf ops[2];

    // // 对0号信号量进行P操作
    // ops[0].sem_num = semnum;
    // ops[0].sem_op  = -1;

    // // 对1号信号量进行V操作
    // ops[1].sem_num = semnum;
    // ops[1].sem_op  = +1;

    // semop(semid, ops, 2); // 原子性地对所有的信号元素进行P/V操作

    return true;
}

bool sem_p(int semid, int semnum)
{
    return __sem_pv(semid, semnum, -1);
}


bool sem_v(int semid, int semnum)
{
    return __sem_pv(semid, semnum, +1);
}